import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferStrategy;
import java.util.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.io.*;
import java.net.*;
import java.util.*;

public class Escenario extends Canvas implements Escenografia, KeyListener
{
	private BufferStrategy strategy;
	private SpriteCache spriteCache;
	private ArrayList<Actor> actores;
	//private boolean arriba, abajo, izquierda, derecha;
	Nave naveCliente;
	Socket socket;
	PrintWriter salida;
	String arriba;
	String abajo;
	String izquierda;
	String derecha;
	String espacio;
	String escape;


	public Escenario(Socket socket)
	{
		String arriba = "false";
		String abajo = "false";
		String izquierda = "false";
		String derecha = "false";
		String espacio = "false";
		String escape = "false";

		this.socket = socket;
		try
		{
			salida = new PrintWriter(new BufferedWriter(new OutputStreamWriter(this.socket.getOutputStream())), true);
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}

		spriteCache = new SpriteCache();
		JFrame ventana = new JFrame("Multibatt");
		JPanel panel = (JPanel)ventana.getContentPane();
		setBounds(0, 0, Escenografia.WIDTH, Escenografia.HEIGHT);
		panel.setPreferredSize(new Dimension(Escenografia.WIDTH, Escenografia.HEIGHT));
		panel.setLayout(null);
		panel.add(this);
		ventana.setBounds(0, 0, Escenografia.WIDTH, Escenografia.HEIGHT);
		ventana.setVisible(true);
		ventana.addWindowListener(
			new WindowAdapter()
			{
				public void windowClosing(WindowEvent e)
				{
					System.exit(0);
				}
			}
		);
		ventana.setResizable(false);
		createBufferStrategy(2);
		strategy = getBufferStrategy();
		addKeyListener(this);
		/*
		arriba = false;
		abajo = false;
		izquierda = false;
		derecha = false;
		*/
		requestFocus();
		//crear();
	}

	public void keyPressed(KeyEvent e)
	{
		switch (e.getKeyCode())
		{
			case KeyEvent.VK_UP : arriba = "true"; break;
			case KeyEvent.VK_DOWN : abajo = "true"; break;
			case KeyEvent.VK_LEFT : izquierda = "true"; break;
			case KeyEvent.VK_RIGHT : derecha = "true"; break;
			case KeyEvent.VK_SPACE : espacio = "true"; break;
			case KeyEvent.VK_ESCAPE : escape = "true"; break;
		}
		String teclas =
			"<teclas>" +
			"<izquierda>" + izquierda  + "</izquierda>" +
			"<derecha>" + derecha + "</derecha>" +
			"<adelante>" + arriba + "</adelante>" +
			"<atras>" + abajo + "</atras>" +
			"<espacio>" + espacio + "</espacio>" +
			"<escape>" + escape + "</escape>" +
			"</teclas>";

		salida.println (teclas);

	}

	public void keyReleased(KeyEvent e)
	{
		switch (e.getKeyCode())
		{
			case KeyEvent.VK_UP : arriba = "false"; break;
			case KeyEvent.VK_DOWN : abajo = "false"; break;
			case KeyEvent.VK_LEFT : izquierda = "false"; break;
			case KeyEvent.VK_RIGHT : derecha = "false"; break;
			case KeyEvent.VK_SPACE : espacio = "false"; break;
			case KeyEvent.VK_ESCAPE : escape = "false"; break;
		}
		String teclas =
			"<teclas>" +
			"<izquierda>" + izquierda  + "</izquierda>" +
			"<derecha>" + derecha + "</derecha>" +
			"<adelante>" + arriba + "</adelante>" +
			"<atras>" + abajo + "</atras>" +
			"<espacio>" + espacio + "</espacio>" +
			"<escape>" + escape + "</escape>" +
			"</teclas>";

		salida.println (teclas);
	}

	public void keyTyped(KeyEvent e)
	{
	}

	public void crear()
	{
		actores = new ArrayList<Actor>();
		//for (int i = 0; i < 1; i++)
		//{
			//Nave nave = new Nave(this, true);
			naveCliente = new Nave(this, true);
			naveCliente.actuar (new DatosActor(0, 0, 0, ""));
			//actores.add(naveCliente);
		//}
	}

	public void actualizar(XmlCliente comportamiento)
	{
		//String[] strings = comportamiento.split(";");
		Iterator iNave;
		Iterator iBala;
		Iterator iAsteroide;

		comportamiento.parsearEstadoDePartida();
		

		iNave = comportamiento.naves.iterator();
		iBala = comportamiento.balas.iterator();
		iAsteroide = comportamiento.asteroides.iterator();
		
		//la nave del cliente de este escenario
		DatosActor dt = comportamiento.naveCliente;
		//System.out.println(dt.x + " " + dt.y + " " + dt.angulo + " " + dt.estado + " " + dt.cliente);
		naveCliente.actuar (dt);
		//System.out.println("naveCliente.actuar");

		for (int i = 0; i < actores.size(); i++)
		{
			Actor actor = (Actor) actores.get(i);
			if(actor instanceof Nave)
			{
				//System.out.println("actor instanceof Nave");
				if (iNave.hasNext())
				{
					DatosActor dta = (DatosActor)iNave.next();
					actor.actuar(dta);
					//System.out.println(dta.x + " " + dta.y + " " + dta.angulo + " " + dta.estado + " " + dta.cliente + "los demas");
					//System.out.println("Nave.next()");
				}
			}
			if(actor instanceof Nave)
			{
				if (iBala.hasNext())
					actor.actuar((DatosActor)iBala.next());
			}
			if(actor instanceof Nave)
			{
				if (iAsteroide.hasNext())
					actor.actuar((DatosActor)iAsteroide.next());
			}

		}
		while (iNave.hasNext())
		{
			System.out.println("*************************creando nave");
			Nave nave = new Nave(this, false);
			nave.actuar((DatosActor)iNave.next());
			actores.add(nave);
		}

		while (iBala.hasNext())
		{

		}

		while (iAsteroide.hasNext())
		{

		}
	}

	public void mostrar()
	{
		Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
		g.setColor(Color.white);
		g.fillRect(0, 0, getWidth(), getHeight());
		for (int i = 0; i < actores.size(); i++)
		{
			Actor actor = (Actor) actores.get(i);
			actor.mostrar(g);
		}
		naveCliente.mostrar(g);
		strategy.show();
	}
/*
	public boolean getArriba()
	{
		return arriba;
	}

	public boolean getAbajo()
	{
		return abajo;
	}

	public boolean getIzquierda()
	{
		return izquierda;
	}

	public boolean getDerecha()
	{
		return derecha;
	}
*/
	public SpriteCache getSpriteCache()
	{
		return spriteCache;
	}

	public void refrescarPantalla(XmlCliente comportamiento)
	{
		actualizar(comportamiento);
		mostrar();
	}
}
